<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="d" name="d" style="display: none"><p>我爱学习</p></div>
<script>
    //1.找出数组的最大元素
    var max = Math.max(2, 4, 5, 6, 10);
    // console.log(max);
    var attr = [2, 4, 5, 6, 10, 66];
    Math.max.apply(null, attr);//数组的最大值√
    // console.log( Math.max.apply(null,attr));

    //2.将类数组转换成真正的数组
    function add() {
        // console.log(arguments);

        //prototype  语义:原型   转换完成
        var arr = Array.prototype.slice.apply(arguments);
        // console.log(arr);
    }
    add(3, 4, 5, 1, 7, 9);
    
    //3.数组追加
    var arr=[];
   var df= Array.prototype.push.apply(arr,[1,3,5,7,12,45]);
    console.log(arr);
    console.log(df);//长度
    
    //4.利用call和apply做继承

    function Animal(name,age) {
        this.name=name;
        this.age=age;
        this.sdd=function () {
            console.log("名字："+this.name+"岁数"+this.age);
        }
    }
   function Cat(name,age) {
        //继承
       Animal.call(this,name,age);//数值
   }

   var c=new Cat("小花",18);
    c.sdd();
    
    function Dog() {
        Animal.apply(this,arguments);//数组
    }
    var d=new Dog("小狗",14);
    console.log(d);
    d.sdd();
    //5.使用log代理console.log()
    function log() {
        console.log.apply(console,arguments);
    }
    var att=[2,3,4,5]
    log(arr);

    //bind  es5新增的方法，主要作用：将函数绑定到某个对象中，并且有返回值（一个函数）
    function f(y) {
        return this.x+y;
    }
    var obj={
        x:3
    };
   var fx= f.bind(obj);

    console.log(fx(2));

    //常见的函数式编程技术-函数柯里化

    function getcoolor(colors,size,other) {
        console.log(colors,size,other);
    }
    var binds=getcoolor.bind(null,"red",1024);
    binds(54)
    

    // function f() {
    //
    // }
    // var obj=new f();
    // f.prototype.a=3;
    // console.log(obj.a);

    //apply()  call()

    // window.color = 'red';
    // var obj = {color: 'blue'};
    //
    // function f1() {
    //     console.log(this.color);
    // }
    //
    // f1();
    // f1.call(obj)
    //在非严格模式下，如果使用call或者apply(),传入一个null或者undefined会被转换成一个全局对象window
    //在严格模式下，函数的指向始终是指定值
    // 'use strict';
    // var color='red';
    // function dd() {
    //
    //     console.log(this);
    //     console.log(this.color);
    // }
    // dd.call(null)

    // function f1() {
    //     // switch (arguments.length) {
    //     //     case 0:
    //     //         return 100;
    //     //         break;
    //     //     case 1:
    //     //         return arguments[0]+100;
    //     //         break;
    //     //     case 2:
    //     //         return arguments[0]+arguments[1]+100;
    //     //         break;
    //     // }
    //     var cont=0;
    //     for (let i = 0; i < arguments.length; i++) {
    //         cont+=arguments[i];
    //     }
    //     return cont+100;
    // }
    // console.log(f1());


    // var d=document.getElementsByName('d')[0];

    // function f(x,y) {
    //     "use strict"//严格模式下指向undefined
    //     console.log(this);
    //     return x+y;
    // }
    // console.log(f(2,1));

    // function f() {
    //     this.a=1;
    //     console.log(this);
    // }
    // f();
    // console.log(this);
    //
    // this.a=5;
    // console.log(this);
    // var obj={
    //     a:1,
    //     fn:function () {
    //         this.a=9;
    //     }
    // }
    // obj.fn();
    // console.log(obj.a);

    // var n={n:3};
    // function f() {
    //     this.a = 1;
    //     this.n=5;
    //     return n;
    // }
    // // console.log(f.n);
    // f();
    // var obj = new f();
    // console.log(obj.n);
    'use strict';

    // function f(x,y) {
    //
    //     console.log(arguments);
    // }
    // f(1,2,3,4)
    //不存在重载！！！！！！！！！！！

    /* //1函数的声明
     function f(a,b,c) {
         console.log(a);
         console.log(b);
         console.log(c);
     }
     f(1,2);
     //函数表达书  hello相当于函数名称，变量名称，可以在函数里面内外部使用
     he函数名称相当于函数的参数，只能在内部使用*/
    // var hello=function he(x,y) {
    //     console.log(x,y);
    // }
    // hello(1,2)
    // function f() {
    //     return {
    //         name: 'Javascript',
    //         age: 19
    //     }
    // }
    //
    // console.log(f().name);//如果函数没有返回值，调用表达式的结果是undefined

    // function f() {
    //     // try {
    //     //     // console.log(x);
    //     //     return 2;
    //     // }catch (e) {
    //     //     console.log(e);
    //     //     return 1;
    //     // }finally {
    //     //     return 0;
    //     // }
    //     // return 2;*只会执行前面的
    //     // return 5
    //     return {a:1};
    //
    //     return 5;
    // }
    // var ff=new f();
    // console.log(ff.constructor);


</script>
</body>
</html>